--- title: Title keywords: fastai sidebar: home_sidebar summary: "summary" description: "summary" ---
%reload_ext autoreload
%autoreload 2
%matplotlib inline
from fastai import *
from fastai.vision import *
from fastai.data_block import *
import scipy.io as sio
from fastai.callbacks import *
from mrimage_update import *
# path = Path('/home/projects/data/lvquan/')
path = Path('/media/ismael/01D2273CA76327A0/datasets/LVQuan20xx/2019/')
(path/'train/').ls()[:5]
def phase_labeler(fn):
classes=np.array(['diastolic','systolic'])
return classes[sio.loadmat(fn)['lv_phase'][0]]
src_data = (MRImageCtxList.from_folder(path/'train/', extensions=['.mat']))
# defaults.device = 'cpu'
tfms = get_transforms()
classes=np.array(['diastolic','systolic'])
src_data = (MRImageCtxList.from_folder(path/'train/', extensions=['.mat'])
.split_by_rand_pct(seed=42)
.label_from_func(phase_labeler, label_cls=MRMultiCategoryList)
.transform(tfms, size=256, slicewise=False)
)
data = src_data.databunch(bs=1)
data.train_ds.y
data = src_data.databunch(bs=1)
data.normalize(imagenet_stats)
learn = cnn_learner(data, models.resnet34)
model = nn.Sequential(Lambda(mri_to_images), learn.model,
LambdaWithArgs(out_to_mri_out, n_slices=20))
# data.normalize(imagenet_stats)
data.show_batch(rows=1)
learn.model = model
learn.opt_func
lr_find(learn)
learn.recorder.plot()
x, y = data.one_batch(cpu=False)
res = model(x)
x.shape
y.shape, res.shape
learn.metrics += [accuracy]
lr = 1e-2
# learn.metrics[-1] = [accuracy]
best_cb =SaveModelCallback(learn, monitor='accuracy', mode='max', name='exp1ctx-1')
fit_one_cycle(learn, 20, lr, callbacks=[best_cb])
preds, y = learn.get_preds()
predss = preds.argmax(dim=-1)
i = 10
predss[i], y[i]
# learn.save('exp1-1')
learn.unfreeze()
lr_find(learn)
learn.recorder.plot()
best_cb =SaveModelCallback(learn, monitor='accuracy', mode='max', name='exp1ctx-2')
fit_one_cycle(learn, 20, slice(8e-6, 2e-4), callbacks=[best_cb])
preds, y = learn.get_preds()
predss = preds.argmax(dim=-1)
data.valid_ds.x[2].show()
The worst results (0 or diastole to all slices) are obtained on MRImages that are not very clear like the one above: these are:
1. '/home/projects/data/lvquan/train/patient50.mat',
2. '/home/projects/data/lvquan/train/patient51.mat'
3. '/home/projects/data/lvquan/train/patient49.mat'
Their indexes in the validation set are: 2, 6, 8
If we remove them from the validation set, the accuracy jumps from 84% to 93.75% !
So if we could preprocess dataset image so as to avoid that, we will win !
idxs = [0, 1, *range(3,6), 7,9,10]
(predss[idxs] == y[idxs]).float().mean()
data.valid_ds.x.items[[2, 6, 8]]
# worst result: i = 2, 6, 8
# im
data.valid_ds.x[10].show()
def mri_to_images(mri:Tensor)->Tensor:
return torch.cat([*mri])
def out_to_mri_out(cats:Tensor, n_slices:int=None)->Tensor:
assert n_slices != None, 'Must indicate n_slices'
return cats.reshape(-1, n_slices, *cats.shape[1:])
# learn.unfreeze()
# learn.load('exp1ctx-2')
No evolution, best performance: 0.6863 when unfreezed and 0.6818 when freezed.
Conclusion: Train from scratch without pretraining.
data = src_data.databunch(bs=5)
data.normalize(imagenet_stats)
learn = cnn_learner(data, models.resnet34)
model = nn.Sequential(Lambda(mri_to_images), learn.model,
LambdaWithArgs(out_to_mri_out, n_slices=20))
learn.model = model
wd=1e-2
lr_find(learn, wd=wd)
learn.recorder.plot()
learn.metrics += [accuracy]
lr = 1e-2
best_cb =SaveModelCallback(learn, monitor='accuracy', mode='max', name='phase_stats-1')
fit_one_cycle(learn, 30, lr, callbacks=[best_cb], wd=wd)
preds, y = learn.get_preds()
predss = preds.argmax(dim=-1)
i = 10
predss[i], y[i]
learn.unfreeze()
wd=1e-2
lr_find(learn, wd=wd)
learn.recorder.plot()
best_cb =SaveModelCallback(learn, monitor='accuracy', mode='max', name='phase_stats-2')
fit_one_cycle(learn, 30, slice(1e-6, lr/100), callbacks=[best_cb], wd=wd)
wd=1e-1
lr_find(learn, wd=wd)
learn.recorder.plot()
best_cb =SaveModelCallback(learn, monitor='accuracy', mode='max', name='phase_stats-2')
fit_one_cycle(learn, 30, slice(1e-5, 1e-4), callbacks=[best_cb], wd=wd)
wd=0.2
lr_find(learn, wd=wd)
learn.recorder.plot()
Conclusion: pretrained is better as from scratch is very dumb, just give 0 to all.But perhaps it needs more training
learn.export('phase-2.pkl')
learn.load('phase_stats-1')
learn.export('phase-1.pkl')
data = src_data.databunch(bs=5)
data.normalize(imagenet_stats)
learn = cnn_learner(data, models.resnet34)
model = nn.Sequential(Lambda(mri_to_images), learn.model,
LambdaWithArgs(out_to_mri_out, n_slices=20))
learn.model = model
partial(optim.SGD, momentum=0.9)
optim.SGD()
learn.opt_func = partial(optim.SGD, momentum=0.9)
wd=0.01
lr_find(learn, wd=wd)
learn.recorder.plot()
# learn.metrics += [accuracy]
learn.metrics += [accuracy]
lr = 5e-3
best_cb =SaveModelCallback(learn, monitor='accuracy', mode='max', name='phase_sgd-1')
fit_one_cycle(learn, 30, lr, callbacks=[best_cb], wd=wd)
preds, y = learn.get_preds()
predss = preds.argmax(2)
preds.shape
i= 10
predss[i], y[i]
data.valid_ds.x[8].show()
learn.unfreeze()
wd=0.001
lr_find(learn, wd=wd)
learn.recorder.plot()
best_cb =SaveModelCallback(learn, monitor='accuracy', mode='max', name='phase_sgd-2')
fit_one_cycle(learn, 30, slice(1e-5, lr/10), callbacks=[best_cb], wd=wd)
learn = cnn_learner(data, models.resnet34)
model = nn.Sequential(Lambda(mri_to_images), learn.model,
LambdaWithArgs(out_to_mri_out, n_slices=20))
learn.model = model
learn.opt_func = partial(optim.RMSprop, momentum=0.9)
wd=0.01
lr_find(learn, wd=wd)
learn.recorder.plot()
learn.metrics +=[accuracy]
lr = 1e-2
best_cb =SaveModelCallback(learn, monitor='accuracy', mode='max', name='phase_rmsprop-1')
fit_one_cycle(learn, 30, lr, callbacks=[best_cb], wd=wd)
preds, y = learn.get_preds()
predss = preds.argmax(2)
i = 5
y[i], predss[i]
data.train_ds.x[-4].show()
data.train_ds.x[-4].data.shape
res = learn.model(data.train_ds.x[-4].data.unsqueeze(0).cuda())
res.argmax(-1)
data.train_ds.x[-4].data.shape
learn.unfreeze()
wd=0.01
lr_find(learn, wd=wd)
learn.recorder.plot()
best_cb =SaveModelCallback(learn, monitor='accuracy', mode='max', name='phase_rmsprop-2')
fit_one_cycle(learn, 30, slice(2e-6, 2e-5), callbacks=[best_cb], wd=wd)
src_fdata = (MRImageCtxList.from_folder(path/'train/', extensions=['.mat'])
.split_none()
.label_from_func(phase_labeler, label_cls=MRMultiCategoryList)
.transform(tfms, size=256, slicewise=False)
)
fdata = src_fdata.databunch(bs=5)
fdata.normalize(imagenet_stats)
learn = cnn_learner(fdata, models.resnet34)
model = nn.Sequential(Lambda(mri_to_images), learn.model,
LambdaWithArgs(out_to_mri_out, n_slices=20))
learn.model = model
learn.opt_func = partial(optim.RMSprop, momentum=0.9)
learn.load('phase_rmsprop-2')
# wd=1e-2
# lr_find(learn, wd=wd)
learn.recorder.plot()
lr = 4e-3
fit_one_cycle(learn, 30, lr)
learn.save('phase_final-1')
learn.load('phase_final-1')
learn.unfreeze()
wd=1e-3
lr_find(learn, wd=wd)
learn.recorder.plot()
fit_one_cycle(learn, 30, slice(1e-6, 8e-5))
learn.load('phase_final-2')
learn.export('pfinal2.pkl')
learn = cnn_learner(data, models.resnet34)
model = nn.Sequential(Lambda(mri_to_images), learn.model,
LambdaWithArgs(out_to_mri_out, n_slices=20))
learn.model = model
wd=0.01
lr_find(learn, wd=wd)
learn.recorder.plot()
learn.metrics += [accuracy]
lr=1e-2
best_cb =SaveModelCallback(learn, monitor='accuracy', mode='max', name='phase_adam-1')
fit_one_cycle(learn, 30, lr, callbacks=[best_cb], wd=wd)
learn.unfreeze()
wd=0.01
lr_find(learn, wd=wd)
learn.recorder.plot()
best_cb =SaveModelCallback(learn, monitor='accuracy', mode='max', name='phase_adam-2')
fit_one_cycle(learn, 30, slice(7e-5, 8e-4), callbacks=[best_cb], wd=wd)
"change test MRI axis from [n_slices, W, H] to [W, H, n_slices]"
def updateTest(fn, ax=0, dest_ax=-1):
x = sio.loadmat(fn)
im = x['image']
im = np.moveaxis(im, ax, dest_ax)
x['image'] = im
sio.savemat(fn,x)
# Apply it one time !!
# [updateTest(str(f)) for f in test.items]
# defaults.device = 'cpu'
test = MRImageList.from_folder(path/'TestData_LVQuan19', extensions=['.mat'])
# learner = load_learner(path/'train', file='pfinal2.pkl', test=test)
test[5].show()
test
preds = learner.get_preds(DatasetType.Test)[0].argmax(dim=-1)
preds.shape
preds[29]
predflats = preds.flatten().cpu().numpy()[None]
subname = 'LVQUAN_IK-LB'
dic = {'lv_phase_hat': predflats}
# dic = sio.loadmat(subname)
dic['lv_phase_hat'] = predflats
dic['lv_phase_hat'].shape
sio.savemat(subname,dic )
rdic = sio.loadmat(subname)
rdic.keys()